/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package utiles;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * Note: This code is based on - <a href=
 * "http://download.oracle.com/javase/tutorial/collections/interfaces/set.html"
 * >Java Tutorial: The Set Interface</a> <br>
 *
 * Using LinkedHashSet, even though slightly slower than HashSet, in order to
 * ensure order is always respected (i.e. if called with TreeSet or
 * LinkedHashSet implementations).
 *
 * @author Ciaran O'Reilly
 * @author Ravi Mohan
 */
public class SetOps {

        /**
         *
         * @param <T>
         * @param s1
         * @param s2
         * @return the union of s1 and s2. (The union of two sets is the set
         *         containing all of the elements contained in either set.)
         */
        public static <T> Set<T> union(Set<T> s1, Set<T> s2) {
                Set<T> union = new LinkedHashSet<T>(s1);
                union.addAll(s2);
                return union;
        }

        /**
         *
         * @param <T>
         * @param s1
         * @param s2
         * @return the intersection of s1 and s2. (The intersection of two sets is
         *         the set containing only the elements common to both sets.)
         */
        public static <T> Set<T> intersection(Set<T> s1, Set<T> s2) {
                Set<T> intersection = new LinkedHashSet<T>(s1);
                intersection.retainAll(s2);
                return intersection;
        }

        /**
         *
         * @param <T>
         * @param s1
         * @param s2
         * @return the (asymmetric) set difference of s1 and s2. (For example, the
         *         set difference of s1 minus s2 is the set containing all of the
         *         elements found in s1 but not in s2.)
         */
        public static <T> Set<T> difference(Set<T> s1, Set<T> s2) {
                Set<T> difference = new LinkedHashSet<T>(s1);
                difference.removeAll(s2);
                return difference;
        }
}
